
using KinonekoSoftware.CodariaDB.Documents.Timelines;

namespace KinonekoSoftware.Studio.Pages.Notions
{
    partial class PlotsQuickEditorViewModel
    {
        class DeepFirstSearchContext
        {
            public List<StoryPoint> Collection;
            public int              Index;
        }
        
        private static Plot NewPlot(string name, string intro)
        {
            var segment = new Plot
            {
                Id       = ID.GetShortID(),
                Name     = name,
                Intro    = intro,
                Points = new List<string>(),
            };

            return segment;
        }
        

        private void OpenSegments(StoryPoint point)
        {
            _timelineSystem.PushStoryPointLayer(point);
        }
        
        
        //-------------------------------------------------------------
        //
        //          Command Handlers
        //
        //-------------------------------------------------------------
        private async void DoAddPlotCommand()
        {
            var r = await MasterDetailViewModel.New(TitleSR.New, "新建一个新的剧情碎片集合。");

            if (!r.IsFinished)
            {
                return;
            }

            //
            // 设置为当前打开的选项。
            var plot = NewPlot(r.Value.Name, r.Value.Intro);
            
            //
            //
            _timelineSystem.Add(plot);
            
            //
            //
            Plot = plot;
        }

        private async void DoEditPlotCommand(Plot target)
        {
            if (target is null)
            {
                return;
            }

            var r = await MasterDetailViewModel.Edit(target.Name, target.Intro, TitleSR.New, "新建一个新的剧情碎片集合。");

            if (!r.IsFinished)
            {
                return;
            }

            target.Name  = r.Value.Name;
            target.Intro = r.Value.Intro;

            //
            // 保存到数据库
            _timelineSystem.Update(target);
        }

        private async void DoRemovePlotCommand(Plot target)
        {

            if (target is null)
            {
                return;
            }

            if (!await RemoveItem())
            {
                return;
            }


            //
            // 保存到数据库
            _timelineSystem.Remove(target);
            
            //
            // 如果删除的是当前选项，则清空。
            if (ReferenceEquals(Plot, target))
            {
                Plot = PlotCollection.FirstOrDefault();
                Layer   = null;
                LayerCollection.Clear();
            }
        }

        private async void DoAttachPlotCommand(StoryPoint point)
        {
            var result = await ObjectSelectorViewModel.Single(PlotCollection, instance => ((Plot)instance).Name);

            if (result .IsFinished)
            {
                return;
            }

            _timelineSystem.Attach(result.Value);
        }
        
        
        private async void DoCreateBranchCommand()
        {
            // // TODO:
            // var result = await ObjectSelectorViewModel.Single(PlotCollection, instance => ((Plot)instance).Name);
            //
            // if (result .IsFinished)
            // {
            //     return;
            // }
            //
            // var segment    = result.Value;
            // var collection = segment.Points.Select(Build);
            // var map        = new Dictionary<string, StoryPoint>();
            // var root       = new List<StoryPoint>(8);
            // var queue      = new Queue<StoryPoint>(root.Count * root.Count);
            // var stack      = new Stack<DeepFirstSearchContext>(root.Count);
            // var map2       = new Dictionary<string, List<StoryPoint>>();
            // var ordered    = new List<StoryPoint>(64);
            //
            // foreach (var point in collection)
            // {
            //     map.TryAdd(point.Id, point);
            //
            //     if (string.IsNullOrEmpty(point.ParentID))
            //     {
            //         root.Add(point);
            //     }
            //     else
            //     {
            //         if (map2.TryGetValue(point.ParentID, out var collection2))
            //         {
            //             collection2.Add(point);
            //         }
            //         else
            //         {
            //             collection2 = new List<StoryPoint>(8)
            //             {
            //                 point,
            //             };
            //             map2.Add(point.ParentID, collection2);
            //             
            //         }
            //     }
            // }
            //
            // //
            // //
            // root.Sort((a,b) => a.Index - b.Index);
            //
            // foreach (var parent in root)
            // {
            //     //
            //     // 先进入最
            //     while (true)
            //     {
            //         //
            //         // 判断是否能进入下一级?
            //         if (!map2.TryGetValue(parent.Id, out var col))
            //         {
            //             break;
            //         }
            //
            //         stack.Push(new DeepFirstSearchContext
            //         {
            //             Collection = col,
            //             Index      = 0,
            //         });
            //     }
            // }
        }
        
        
        //-------------------------------------------------------------
        //
        //          Commands
        //
        //-------------------------------------------------------------


        public ICommandEX AddPlotCommand    { get; }
        public ICommandEX AttachPlotCommand    { get; }
        public ICommandEX CreateBranchCommand    { get; }
        public ICommandEX EditPlotCommand   { get; }
        public ICommandEX RemovePlotCommand { get; }
    }
}